home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
ashe-1.1
/
xhtml.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-15
|
12KB
|
391 lines
#include "xhtml.h"
#include "xfile.h"
#include "xheader.h"
#include "xmarkup.h"
#include "xstyles.h"
#include "xviewer.h"
#include "xtrans.h"
/*
* xhtml.c - (c) 1994 Copyright by John R. Punin
*
* * main. *
*
* A Simple HTML Editor (ASHE)
*
* John R. Punin Feb - 26 - 1994
*/
/*
ASHE is A Simple HTML Editor with the purpose to help the user to
write HyperText Markup Language documents to be used in the World Wide Web
project. This program is written using programming language C, NCSA HTML
Widget and Motif Osf Windows. ASHE's visual interface was based on the
visual interface of XMosaic.
This program is based on a simple editor. Most of the main key bindings
for emacs are implemented here with the purpose that the user can easily
move and edit a file without using the mouse.
The visual interface of the program is based on a widget hierarchy where the
main_widget is the child of the top_level_widget. The main_widget has
two children a menubar and workarea. The menubar widget has all menus
as a children. The workarea is a paned widget with
the purpose to let the user resize the windows any time.
The workarea has as a main child ,the text widget, where the user is
going to write the HTML document. Other children are the label widgets
to send messages to the user such as errors, title of the documents and
name of the files.
*/
HTML_LIST *head_html=NULL;
HTML_LIST *tail_html=NULL;
MyAppResType myAppRes;
XtTranslations trans_table;
void
main(int argc, char **argv)
{
XtAppContext app_context; /* Application Context */
Widget top_level_widget; /* Application Shell */
HTMLED *he=NULL,*ohe=NULL;
/*
Name_File[0]='\0';
last_command = NONE;
getwd(Home); *//* Get the current Directory */
/*
* * Initialize toolkit
*/
app_context = XtCreateApplicationContext();
top_level_widget = XtVaAppInitialize(
&app_context, /* app_context */
"XHTML", /* Class */
NULL, /* options */
0, /* num_options */
&argc, /* num cmd line */
argv, /* cmd line */
fallbacks, /* fallback */
NULL /* args */
);
if(argv[1]!=NULL)
{
ohe = (HTMLED *)XtMalloc(sizeof(HTMLED));
initialize_editor(ohe);
ohe->href=XtMalloc(strlen(argv[1])+1);
strcpy(ohe->href,argv[1]);
ohe->anchor_target = NULL;
}
else
ohe = NULL;
/* Getting HTML Directory Resource */
XtGetApplicationResources(top_level_widget,&myAppRes, resources,
XtNumber(resources),NULL,0);
Initialize_list();
/* Initialize Translation Table */
trans_table = XtParseTranslationTable(emacs_translations);
he = create_rest_widgets(top_level_widget,ohe);
if(ohe)
{
XtFree(ohe->href);
XtFree((char *)ohe);
}
Insert_html_frame(he);
/*Print_Frames();*/
he->shell = top_level_widget;
XtRealizeWidget(top_level_widget);
XtAppMainLoop(app_context);
}
HTMLED *create_rest_widgets(Widget shell,HTMLED *ohe)
{
HTMLED *he=NULL;
Widget main_widget; /* Main window. */
Widget menubar; /* Menu bar */
Widget workarea; /* Pane */
Widget buttonbox; /* Form */
Widget html_widget; /* HTML Widget */
Widget text_output,title_output,
file_output,textarea;
Widget bopen,blight,
parag,btitle,reload,
header,print,clear,
undo,link,prefor,item; /* pushbuttons. */
Arg arglist[MAXARGS];
int narg,flag;
he = (HTMLED *)XtMalloc(sizeof(HTMLED));
initialize_editor(he);
/* We are going to use a Motif MainWindow Widget here. */
main_widget = XtVaCreateManagedWidget("main", xmMainWindowWidgetClass,
shell, NULL);
/*
* The Motif Menubar. * See the CreateMenubar function for all the steps
*/
menubar= CreateMenuBar(main_widget,he);
/*
* * Create the Paned Widget
*/
workarea = XtVaCreateManagedWidget("workarea", xmPanedWindowWidgetClass,
main_widget, NULL);
/*
* Create Text widget for messages
*/
text_output = XtVaCreateManagedWidget("text_out",
xmLabelWidgetClass,workarea,
XmNshadowThickness, 0,
NULL);
XtManageChild(text_output);
he->text_output = text_output;
title_output = XtVaCreateManagedWidget("title_out",
xmLabelWidgetClass,workarea,
NULL);
XtManageChild(title_output);
he->title_output = title_output;
/*
* * Create the Text child, and the button children.
*/
narg = 0;
XtSetArg(arglist[narg],XmNrows ,20 ); narg++;
XtSetArg(arglist[narg],XmNcolumns ,80 ); narg++;
XtSetArg(arglist[narg],XmNresizeWidth ,False ); narg++;
XtSetArg(arglist[narg],XmNresizeHeight ,False ); narg++;
XtSetArg(arglist[narg],XmNscrollingPolicy ,XmAUTOMATIC ); narg++;
XtSetArg(arglist[narg],XmNeditMode ,XmMULTI_LINE_EDIT ); narg++;
textarea = XmCreateScrolledText(workarea,"text",arglist,narg);
XtOverrideTranslations(textarea,trans_table);
XtManageChild(textarea);
he->textarea = textarea;
html_widget = CreateHTMLwidget(workarea,he);
he->html_text = html_widget;
file_output = XtVaCreateManagedWidget("file_out",
xmLabelWidgetClass,workarea,
NULL);
XtManageChild(file_output);
he->file_output = file_output;
/* Setting the new window */
/* if((ohe == NULL)||
(!strcmp(ohe->href,"*scratch*")))*/ /* Problem with Linux */
narg = 0;
if(ohe == NULL)
narg = 1;
else if (!strcmp(ohe->href,"*scratch*"))
narg = 1;
if(narg)
{
Set_label(text_output,"ASHE (A Simple HTML Editor)");
Set_label(title_output,"");
XmTextSetString(textarea,XTEXT_STRING);
Set_label(file_output," *scratch* ");
}
else
{
if(ohe->anchor_target != NULL)
{
he->anchor_target = XtMalloc(strlen(ohe->anchor_target)+1);
strcpy(he->anchor_target,ohe->anchor_target);
}
read_file(ohe->href,he);
}
/*
* * Create the form to hold the file, save, clear and print buttons.
*/
buttonbox = XmCreateForm(workarea, "buttonbox", NULL, 0);
XtManageChild(buttonbox);
XtVaSetValues(buttonbox,XmNuserData,he,NULL);
print = XmCreatePushButton(buttonbox, "print", NULL, 0);
XtManageChild(print);
clear = XmCreatePushButton(buttonbox, "clear", NULL, 0);
XtManageChild(clear);
bopen = XmCreatePushButton(buttonbox, "open", NULL, 0);
XtManageChild(bopen);
reload = XmCreatePushButton(buttonbox, "reload", NULL, 0);
XtManageChild(reload);
btitle =XmCreatePushButton(buttonbox, "title", NULL, 0);
XtManageChild(btitle);
parag =XmCreatePushButton(buttonbox, "paragraph", NULL, 0);
XtManageChild(parag);
header = XmCreatePushButton(buttonbox, "header", NULL, 0);
XtManageChild(header);
link = XmCreatePushButton(buttonbox, "link", NULL, 0);
XtManageChild(link);
prefor = XmCreatePushButton(buttonbox, "prefor", NULL, 0);
XtManageChild(prefor);
item = XmCreatePushButton(buttonbox, "item", NULL, 0);
XtManageChild(item);
undo = XmCreatePushButton(buttonbox, "undo", NULL, 0);
XtManageChild(undo);
blight = XmCreateToggleButton(buttonbox, "mark_tags", NULL, 0);
XtVaSetValues(blight,
XtVaTypedArg,XmNlabelString,XmRString,"mark tags",10,NULL);
XtManageChild(blight);
/* Tell the buttons how to position themselves in the form. */
XtVaSetValues(clear, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, print, NULL);
XtVaSetValues(bopen, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, clear, NULL);
XtVaSetValues(reload, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, bopen, NULL);
XtVaSetValues(btitle, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, reload,NULL);
XtVaSetValues(parag, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, btitle, NULL);
XtVaSetValues(header, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, parag, NULL);
XtVaSetValues(link, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, header, NULL);
XtVaSetValues(prefor, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, link, NULL);
XtVaSetValues(item, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, prefor, NULL);
XtVaSetValues(undo, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, item, NULL);
XtVaSetValues(blight, XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, undo, NULL);
/* Add the callback to verify the input to the text */
XtAddCallback(textarea, XmNmodifyVerifyCallback,
(XtCallbackProc)verify_text, (XtPointer)he);
XtAddCallback(textarea,XmNlosingFocusCallback,(XtCallbackProc)Setmenu,
(XtPointer)he);
/*XtAddCallback(textarea,XmNfocusCallback,(XtCallbackProc)gain_focus,NULL);*/
XtAddCallback(html_widget, WbNanchorCallback, (XtCallbackProc)anchor_call,
(XtPointer)he);
/* Add the callbacks */
XtAddCallback(print, XmNactivateCallback,
(XtCallbackProc)PrintButtonCallBack,(XtPointer)he);
XtAddCallback(clear, XmNactivateCallback,
(XtCallbackProc)ClearButtonCallBack,(XtPointer)he);
XtAddCallback(bopen, XmNactivateCallback, (XtCallbackProc)file_cb,
(XtPointer)1);
XtAddCallback(reload, XmNactivateCallback,(XtCallbackProc) Reload_HTML,
(XtPointer)he);
XtAddCallback(btitle, XmNactivateCallback, (XtCallbackProc)create_title,
(XtPointer)he);
XtAddCallback(parag, XmNactivateCallback, (XtCallbackProc)create_paragraph,
(XtPointer)he);
XtAddCallback(header, XmNactivateCallback, (XtCallbackProc)create_header,
(XtPointer)he);
XtAddCallback(link, XmNactivateCallback, (XtCallbackProc)create_linker,
(XtPointer)he);
XtAddCallback(prefor, XmNactivateCallback, (XtCallbackProc)create_pre,
(XtPointer)he);
XtAddCallback(item, XmNactivateCallback, (XtCallbackProc)set_simple_entry,
(XtPointer)he);
XtAddCallback(undo, XmNactivateCallback, (XtCallbackProc)create_undo,
(XtPointer)he);
XtAddCallback(blight, XmNvalueChangedCallback,
(XtCallbackProc)Set_Underline_Tags,(XtPointer)he);
/* Tell the MainWindow how to position its children */
XmMainWindowSetAreas(main_widget, menubar, NULL, NULL, NULL,
workarea);
return(he);
}
void initialize_editor(HTMLED *he)
{
he->shell = NULL;
he->textarea = NULL;
he->file_output = NULL;
he->text_output = NULL;
he->title_output = NULL;
he->html_text = NULL;
he->editwidget = NULL;
he->open_dialog = NULL;
he->save_dialog = NULL;
he->insert_dialog = NULL;
he->export_dialog = NULL;
he->user_data = NULL;
he->header_num = 0;
he->fonts = TIMES;
he->export_option = PTEXT;
he->modified_file=FALSE;
he->toggle_mark_tag = FALSE;
he->method = GET;
he->last_command = NONE;
strcpy(he->Name_File,"*scratch*");
he->format_file = NULL;
he->warning = NULL;
he->href = NULL;
he->anchor_target = NULL;
he->text_cleared = NULL;
he->undo_buffer.ubuffer[0] = '\0';
he->undo_buffer.right = 0;
he->undo_buffer.left = 0;
he->undo_buffer.lenleft =0;
he->undo_buffer.lenright = 0;
he->undo_buffer.com_html = NONE;
}
void
gain_focus(Widget w, XtPointer cld, XtPointer cd)
{
XmTextShowPosition(w,XmTextGetCursorPosition(w));
}
void
Initialize_list(void)
{
head_html = (HTML_LIST *)XtMalloc(sizeof(HTML_LIST));
tail_html = (HTML_LIST *)XtMalloc(sizeof(HTML_LIST));
head_html->fr = NULL;
tail_html->fr = NULL;
head_html->next = tail_html;
tail_html->next = NULL;
}